package com.mastfrog.acteur.mongo;
import com.google.inject.Provider;
import com.mastfrog.util.Exceptions;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.MongoCommandException;
/**
*
* @author Tim Boudreau
*/
final class CollectionProvider implements Provider<DBCollection> {
private final Provider<DB> db;
private final String name;
private final Provider<MongoInitializer.Registry> reg;
private DBCollection collection;
public CollectionProvider(Provider<DB> db, String name, Provider<MongoInitializer.Registry> reg) {
this.db = db;
this.name = name;
this.reg = reg;
}
private DBCollection _get() {
DB d = db.get();
if (!d.collectionExists(name)) {
synchronized (this) {
if (!d.collectionExists(name)) {
BasicDBObject arg = new BasicDBObject();
MongoInitializer.Registry registry = reg.get();
try {
registry.onBeforeCreateCollection(name, arg);
DBCollection coll = d.createCollection(name, arg);
registry.onCreateCollection(coll);
return collection = coll;
} catch (MongoCommandException ex) {
if ("collection already exists".equals(ex.getErrorMessage())) {
return d.getCollection(name);
}
return Exceptions.chuck(ex);
}
} else {
return collection = d.getCollection(name);
}
}
} else {
return collection = d.getCollection(name);
}
}
@Override
public DBCollection get() {
if (collection == null) {
synchronized(this) {
if (collection == null) {
return _get();
}
}
}
return collection;
}
}